package com.wwj.aiAnswer.service.impl;

import cn.hutool.core.io.file.FileWriter;
import com.wwj.aiAnswer.entity.AnswerEntity;
import com.wwj.aiAnswer.service.TrainService;
import com.wwj.aiAnswer.utils.GetTxtToListUtil;
import lombok.extern.slf4j.Slf4j;
import org.springframework.data.redis.core.RedisTemplate;
import org.springframework.stereotype.Service;
import org.wlld.naturalLanguage.Talk;
import org.wlld.naturalLanguage.TemplateReader;
import org.wlld.naturalLanguage.WordTemple;

import javax.annotation.Resource;
import java.io.File;
import java.util.ArrayList;
import java.util.List;

@Service
@Slf4j
public class TrainServiceImpl implements TrainService {

    @Resource
    private RedisTemplate<String,String> redisTemplate;

    private static WordTemple wordTemple;

    /**
     * 模型训练
     * @param filePath 待训练模型文件
     * @return 是否成功训练
     * @throws Exception IO异常
     */
    @Override
    public boolean trainModel(String filePath) throws Exception {
        // 删除Redis0号库所有数据（清空历史存入的内容）
        redisTemplate.keys("*");
        // 将model.txt文件转换成Java的List类型
        List<AnswerEntity> txtList = GetTxtToListUtil.getTxtToList(filePath);
        // 创建训练文件
        File file = new File("C:\\CodeDevelopment\\trainTXT\\train.txt");
        System.out.println("文件创建状态：" + file.createNewFile());
        // 创建写文件对象
        FileWriter fileWriter = new FileWriter("C:\\CodeDevelopment\\trainTXT\\train.txt");
        // 保证train.txt是一个空的文本
        fileWriter.write("",false);
        // 遍历集合
        List<String> listForQuestion = new ArrayList<>();
        for (int i = 1; i <= txtList.size(); i++) {
            AnswerEntity answerEntity = txtList.get(i - 1);
            // 将回答存入answer格式为：key:1 value:answer
            redisTemplate.opsForValue().set(String.valueOf(i), answerEntity.getAnswer());
            // 将提问写入训练文档
            for (String item : answerEntity.getQuestion()) {
                // 问题#1 形式
                String itemAfter = item + "#" + i;
                // 放入需要写入的集合中
                listForQuestion.add(itemAfter);
            }
        }
        // 将List数据写入
        fileWriter.writeLines(listForQuestion,true);

        // 创建模板读取对象（easyAi）
        TemplateReader templateReader = new TemplateReader();
        wordTemple = new WordTemple();
        // easyAI将train.txt解析、训练模型
        templateReader.read("C:\\CodeDevelopment\\trainTXT\\train.txt","UTF-8",wordTemple);
        return true;
    }

    @Override
    public String answerForAI(String question) throws Exception {
        // wordTemple：训练好的模型保存了模型
        if (wordTemple == null) {
            return "问答模板未上传，请上传";
        }
        // 创建Talk对象传之前训练的模型给构造方法
        Talk talk = new Talk(wordTemple);
        // 将问题放入模型给出回答所对应的数字值
        List<Integer> resultList = talk.talk(question);
        System.out.println("AI选择回复内容索引：" + resultList);
        // 以回答所对应的数字值为key，取出value回答的文本
        String answerContent = redisTemplate.opsForValue().get(resultList.get(0).toString());
        if (answerContent == null) {
            // 如果回答的索引是0则无法从Redis取出数据会为null
            answerContent = "抱歉，这个问题还没有学会";
        }
        return answerContent;
    }


}
